/** Fichier définissant un dodécaèdre.
 *
 * Ce fichier contient la définition de la classe Dodecaedre.
 *
 * @file Dodecaedre.hpp
 * @author Johan "Solo" Luisier
 * @date 2010
 */
#ifndef DODECAEDRE_H
#define DODECAEDRE_H

#include "FormeComposee.hpp"

#include "Plan.hpp"

#include "Utils/Erreur.hpp"

#include <vector>

/** Classe implémentant le dodécaèdre pour le raytracing.
 *
 * Cette classe implémente le dodécaèdre pour le raytracing. Après avoir
 * longtemps cherché comment transformer la liste des sommets en liste de
 * plans, j'ai utilisé la même technique que pour l'Icosaedre. Les 12 sommets
 * d'un icosaèdre servent à définir les 12 faces du dodécaèdre.
 *
 * On utilise des coordonnées locales pour définir les 12 points, qu'on
 * transforme ensuite en coordonnées globales pour définir les Plans.
 *
 * @author Johan "Solo" Luisier
 *
 * @date 2010.
 *
 * @class Dodecaedre "Dodecaedre.hpp" "Formes/Dodecaedre.hpp"
 */
class Dodecaedre : public FormeComposee
{
public:
    // on donne deux coord a la base de la forme plus un vecteur directeur
    // pour diriger la base dans l espace
    Dodecaedre(const Coord& centre, const VecteurU& axeX, const VecteurU& axeY,
               const double& ratio);
    ~Dodecaedre();
protected:
    /**
     * Centre du Dodecaedre, qui est l'origine du système de coordonnées
     * locales, et encore le centre de gravité du solide.
     */
    Coord Centre;
private:
    /**
     * Valeur du nombre d'or, utilisé pour la définition des points dans
     * les coordonnées locales. \f[ \phi = \frac{1 + \sqrt{5} }{2} \f]
     */
    static const double Phi;
    Coord symetries(const Coord& pt, const unsigned int& i) const;
    /**
     * Liste des 12 instances de Plan nécessaires à la construction du
     * Dodecaedre.
     */
    std::vector< Plan::SharedPtr > listplan;
    /**
     * Liste des instances de FormeComposee intermédiaires servant à
     * définir le Dodecaedre.
     */
    std::vector< FormeComposee::SharedPtr > listFC;
};

#endif
